向量---vector
对于许多C程序员而言,(名字,号码)对的内部数组会被看做是一个合适的起点:
struct Entry
{
string name;
int number;
};
Entry phone_book[1000];
void print_entry(int i)
{
cout << phone_book[i].name << ' ' << phone_book[i].number << '\n';
}
但无论如何,内部数组具有固定的规模。如果我们选择了某个很大的规模,那么就会浪费存储;而如果选择一个过小的规模,数组又会溢出。这两种情况都会使我们不得不去写低级的存储管理代码。标准库提供的 vector
能关照好所有这些情况
vector<Entry> phone_book(1000);
void print_entry(int i) // 简单使用,就像数组一样
{
cout << phone_book[i].name << ' ' << phone_book[i].number << '\n';
}
void add_entries(int n) // 将其规模增加n
{
phone_book.resize(phone_book.size() + n);
}
vector()
的成员函数 size()
给出的是它的元素个数。
请注意在 phone_book
的定义中括号的使用。我们是做出了一个元素类型为 vector<Entry>
类型的对象,并通过一个初始值提出对它的规模要求。这与声明内部数组的方式很不一样:
vector<Entry> book(1000) // 1000个元素的向量
vector<Entry> books[1000]; // 1000个空向量的数组
如果你真的犯了一个错误,在声明一个 vector
时将 []
用到了你本来应该用 ()
的地方,在你试图去使用这个 vector
时,几乎可以肯定你的编译器能够捕捉到这个错误,并发出一个错误信息。
vector
是一种能赋值的简单对象。例如,
void f(vector<Entry>& v)
{
vector<Entry> v2 = phone_book;
v = v2;
// ...
}
对 vector
赋值涉及到复制其中的所有元素。这样,在 f()
初始化和赋值之后,在 v
和 v2
里各保有 phone_book
中的各个 Entry
的一份副本。当向量里存有许多元素时,这种看起来无害的赋值和初始化的代价也可能很高。
🔚